<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            width: 100%;
            line-height: 300px;
            background-color: aqua;
            font-size: 200px;
            text-align: center;
        }
    </style>
</head>

<body>
    <div class="box">0</div>
    <script>
        // let timer = null;
        // let box = document.querySelector('.box');
        // box.addEventListener('mousemove', () => {
        //     if (timer) {
        //         clearTimeout(timer)
        //     }
        //     timer = setTimeout(() => {
        //         box.innerHTML++;
        //     }, 1000);
        // })

        // ----------------------------------------

        // let timer = null;
        // let box = document.querySelector('.box');
        // box.addEventListener('mousemove', () => {
        //     if (timer == null) {
        //         timer = setTimeout(() => {
        //             timer = null;
        //             box.innerHTML++;
        //         }, 1000);
        //     }

        // })

        // --------------------------------------------

        // let box = document.querySelector('.box');


        // function debounce(cb, wait) {
        //     let timer = null;
        //     return function() {
        //         let context = this;
        //         // 现在业务逻辑简单无参数，用于接收所有传递的实际参数
        //         let args = arguments;
        //         clearTimeout(timer);
        //         timer = setTimeout(() => {
        //             // cb.apply(context, args)
        //             // cb.call(context, args[0])
        //             cb.bind(context, args[0])()
        //         }, wait);
        //     }
        // };

        // function doSomething(e) {
        //     console.log(this);
        //     box.innerHTML++;
        //     console.log(e); // 事件对象e
        // };

        // box.addEventListener('mousemove', debounce(doSomething, 1000))

        // -----------------------------------------

        let box = document.querySelector('.box');

        function jl(cb, wait) {
            // 标志位
            let flag = true;
            console.log(this);
            return function() {
                console.log(this);
                let context = this;
                let args = arguments;
                if (!flag) {
                    return;
                }
                flag = false
                setTimeout(() => {
                    cb.call(context, args[0]);
                    // 完成业务代码，恢复标志位
                    flag = true;
                }, wait);
            }
        }

        function doSomething(e) {
            console.log(this);
            console.log(e);
            box.innerHTML++;
        }
        box.addEventListener('mousemove', jl(doSomething, 1000))
    </script>
</body>

</html>